package com.qf.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.mapper.DtsStorageMapper;
import com.qf.pojo.DtsStorage;
import com.qf.util.AliyunOSSUtil;
import com.qf.util.UUID;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * @author Wy
 * @version V1.0
 * @Project MavenDemo
 * @Package com.qf.service
 * @Description:
 * @Date 2022/6/20 17:51
 */
@Service
public class StorageServiceImpl implements StorageService {

    @Autowired
    private DtsStorageMapper mapper;
    //阿里云北京服务器地址
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    //子账户账号
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    //子账户密码
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    //桶名字
    @Value("${aliyun.oss.bucketName}")
    private  String bucketName;
    @Override
    public IPage<DtsStorage> queryStoragePage(String key, String name, Integer page, Integer limit, String sort, String order) {

        //1. 创建分页对象
        //参数1: 当前页, 参数2: 每页显示条数
        IPage<DtsStorage> ipage = new Page<>(page,limit);
        //2. 封装查询对象
        QueryWrapper<DtsStorage> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("deleted", false);
        //判断查询条件不为空拼接查询条件
        if(!StringUtils.isEmpty(key)){
            queryWrapper.eq("key", key);
        }
        if(!StringUtils.isEmpty(name)){
            queryWrapper.eq("name", name);
        }
        //排序
        if(!StringUtils.isEmpty(sort) && !StringUtils.isEmpty(order)){
            //判断排序方式是否为升序
            if(order.equalsIgnoreCase("asc")){
                queryWrapper.orderByAsc(sort);
            }else {
                queryWrapper.orderByDesc(sort);
            }

        }

        IPage<DtsStorage> dtsStoragePage = mapper.selectPage(ipage, queryWrapper);


        return dtsStoragePage;
    }

    /**
     *
     * @param name 文件名字
     * @param size 文件大小
     * @param ext   文件扩展名
     * @param context 文件内容
     * @return
     */
    @Override
    public DtsStorage add(String name, Integer size, String ext, byte[] context) throws Exception{
        //1. 生成随机字符串, 作为文件名, 防止文件重名
        String key = UUID.randomUUID().toString();
        //2. 用随机生成的字符串 + 文件扩展名组成新的文件名, 防止文件重名
          String fileName=key+ext;

        //3. 调用阿里云工具类, 保存文件到阿里云oss服务器, 返回保存路径
        String url = AliyunOSSUtil.uploadImage(endpoint, accessKeyId, accessKeySecret, bucketName, fileName, context);
        //4. 创建Storage实体类对象, 赋值属性
        DtsStorage dtsStorage = new DtsStorage();
        dtsStorage.setDeleted(false);
        //创建时间
        dtsStorage.setAddTime(new Date());
        //修改时间
        dtsStorage.setUpdateTime(new Date());
        //保存在阿里云服务器的文件名
        dtsStorage.setKey(fileName);
        //文件原始名字
        dtsStorage.setName(name);
        //文件扩展名
        dtsStorage.setType(ext);
        //文件大小
        dtsStorage.setSize(size);
        //保存在阿里云的服务器位置
        dtsStorage.setUrl(url);
        //保存到数据库中
        mapper.insert(dtsStorage);

        return dtsStorage;
    }

    @Override
    public int update(DtsStorage dtsStorage) {
        //
        dtsStorage.setUpdateTime(new Date());
        int i = mapper.updateById(dtsStorage);
        return i;
    }

    @Override
    public int delect(String key) {
        //1. 根据key调用阿里云工具类, 删除阿里oss服务器中的文件
        AliyunOSSUtil.deleteFile(endpoint, accessKeyId, accessKeySecret, bucketName, key);
        //2. 根据key删除数据库中的数据
        QueryWrapper<DtsStorage> objectQueryWrapper = new QueryWrapper<>();
          objectQueryWrapper.eq("'key'", key);
        int delete = mapper.delete(objectQueryWrapper);
        return 0;
    }
}
